===== SLIDE 1 ===== 单元4 Hive数据操作 ===== SLIDE 2 ===== 学习目标/Target 掌握向表加载文件的操作,能够熟练运用LOAD DATA语句将文件中的数据加载到表中。 掌握插入数据的操作,能够熟练运用INSERT语句向表中插入数据。 熟悉将查询结果写入文件的操作,能够使用INSERT语句将表的查询结果导出到指定文件中。 了解事务操作,能够在Hive中启用事务支持,并实现事务表的数据更新与删除。 了解导入与导出数据,能够完成表级别的数据迁移与复制操作。 ===== SLIDE 3 ===== 单元概述/ Summary Hive数据操作是数据仓库建设中承接表结构定义与数据分析应用的重要环节。在完成数据库、表、分区等对象的定义后,还需要将数据加载到表中,并根据业务需求完成数据插入、更新、删除等操作。为此,Hive提供了数据操作语言(Data Manipulation Language,简称DML),用于对表中的数据进行管理。本单元将详细讲解Hive中常用的数据操作方法。 ===== SLIDE 4 ===== 目录/Contents 01 02 03 任务:向表加载文件 任务:向表插入数据 任务:将查询结果写入文件 04 任务:执行Hive事务操作 05 任务:导入与导出数据 ===== SLIDE 5 ===== 任务:向表加载文件 4.1 ===== SLIDE 6 ===== 4.1 任务:向表加载文件 掌握向表加载文件的操作,能够熟练运用LOAD DATA语句将文件中的数据加载到表中。 学习目标 ===== SLIDE 7 ===== Hive是一种面向大规模数据处理的数据仓库工具,在实际应用中通常需要一次性将海量数据加载到表中。这些数据通常来自外部文件,常见存储位置包括HDFS、本地文件系统等。虽然用户可以直接将文件放入表的数据存储目录,由Hive按表的解析规则读取,但官方更推荐使用LOAD DATA语句将文件加载到表中,以确保操作过程的规范性。 4.1 任务:向表加载文件 ===== SLIDE 8 ===== LOAD DATA语句的本质是将文件复制或移动到表的数据存储目录中,并不会对文件内容进行转换,也不会触发执行引擎。从Hive 3.0开始,在某些特殊场景下,该语句可能被内部转换为插入数据的执行逻辑,从而通过执行引擎完成加载。例如,向分桶表加载数据,或向分区表加载数据但未显式指定分区信息。 4.1 任务:向表加载文件 ===== SLIDE 9 ===== LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE [db_name.]table_name [PARTITION (col=value[,col=value,...])] [INPUTFORMAT inputformat SERDE serde]; LOAD DATA语句的语法格式如下。 语法格式 4.1 任务:向表加载文件 ===== SLIDE 10 ===== 接下来,针对上述语法格式的进行介绍。 4.1 任务:向表加载文件 ===== SLIDE 11 ===== LOCAL关键字为可选,用于指定文件是否位于本地文件系统,具体说明如下。 1. LOCAL关键字 4.1 任务:向表加载文件 1 当指定LOCAL关键字时,Hive会从HiveServer2所在服务器的本地文件系统中,将指定文件复制到表的数据存储目录。 2 当未指定LOCAL关键字时,如果filepath参数是带scheme的完整URL,那么Hive会从对应的文件系统中将指定文件移动到表的数据存储目录,否则Hive会根据Hadoop配置文件core-site.xml中的参数fs.defaultFS推断文件系统,并将文件移动到表的数据存储目录。 需要注意的是,在未指定LOCAL关键字的情况下,filepath参数所指向的文件必须与表的数据存储目录位于同一文件系统中。 ===== SLIDE 12 ===== filepath参数既可以指定单个文件路径,也可以指定目录路径。当指定为目录路径时,Hive会复制或移动该目录下的所有文件,包含子目录中的文件(Hive 3.0引入的新特性)。 2. filepath参数 4.1 任务:向表加载文件 ===== SLIDE 13 ===== filepath参数指定的路径支持以下三种形式,具体介绍如下。 4.1 任务:向表加载文件 1 相对路径是指相对于当前位置的路径,在指定LOCAL关键字时,当前位置为本地文件系统中HiveServer2的工作路径,即启动HiveServer2时所处的路径,否则当前位置通常为相应文件系统的/user//路径,其中username取决于Hive的操作用户。 2 绝对路径是指从根目录开始的完整路径。例如/export/data/project/data.txt就是一个绝对路径。 2. filepath参数 2 带scheme的完整URL是指包含协议、主机、端口和路径所组成的统一资源定位符,通过协议可以推断出文件系统的类型。 ===== SLIDE 14 ===== OVERWRITE关键字为可选,用于指定加载数据的模式为覆盖。当指定OVERWRITE关键字时,Hive会清空表中的原有数据,再将指定文件的数据加载到表中;当未指定OVERWRITE关键字时,表示以追加模式加载数据,Hive直接将指定文件的数据追加到表中,而不会清空表中的原有数据。 4.1 任务:向表加载文件 3. OVERWRITE关键字 4. db_name参数 db_name参数为可选,用于指定数据库的名称,表示向该数据库中的表加载数据。若未指定,则向当前使用数据库中的表加载数据。 ===== SLIDE 15 ===== table_name参数用于指定表的名称。 4.1 任务:向表加载文件 5. table_name 参数 6. PARTITION 子句 PARTITION子句为可选,用于向分区表的指定分区加载数据。col参数用于指定分区字段,分区字段的数量与顺序必须与创建分区表时定义的分区字段一致。value用于指定分区字段对应的取值。 ===== SLIDE 16 ===== 在Hive 3.0之前,向分区表加载数据时,必须通过PARTITION子句显式指定分区信息,这种方式称为静态分区。从Hive 3.0开始,如果未指定PARTITION子句,Hive会尝试自动推断,将文件的最后N列数据作为分区字段的值,其中N等于分区字段的数量,这种方式称为动态分区。若文件的内容不符合预期,则会报错。 4.1 任务:向表加载文件 6. PARTITION 子句 ===== SLIDE 17 ===== INPUTFORMAT子句和SERDE子句为可选,在Hive 3.0中新增,用于指定读取文件的规则,其中inputformat参数用于指定读取文件所使用的类,默认为TextInputFormat,适用于文本文件类型;serde参数用于指定序列化和反序列化的类型,默认为原生SerDe。 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 ===== SLIDE 18 ===== 接下来,演示如何将文件加载到Hive表和分区中,具体内容如下。 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 ===== SLIDE 19 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 01 在Hive中创建数据库chapter4,具体HiveQL语句如下。 CREATE DATABASE IF NOT EXISTS chapter4; ===== SLIDE 20 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 02 在chapter4数据库中创建表orders_np,具体HiveQL语句如下。 点击查看 ===== SLIDE 21 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 03 在chapter4数据库中创建分区表orders,具体HiveQL语句如下。 点击查看 ===== SLIDE 22 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 04 在虚拟机Node02中创建/export/data/chapter4目录,用于存放向表orders_np和分区表orders加载数据时所需的文件,在虚拟机Node02中执行如下命令。 mkdir /export/data/chapter4 ===== SLIDE 23 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 05 将文件orders_np.json、orders_2025_08.csv和orders_2025_09.csv上传到虚拟机Node02的/export/data/chapter4目录,关于这三个文件的介绍如下。 ①文件orders_np.json用于向表orders_np加载数据,其内容如文件。 点击查看 ===== SLIDE 24 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 05 ②文件orders_2025_08.csv用于通过静态分区的方式向分区表orders加载数据,其内容如文件。 点击查看 ===== SLIDE 25 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 05 ③文件orders_2025_09.csv用于通过动态分区的方式向分区表orders加载数据,其内容如文件。 点击查看 ===== SLIDE 26 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 06 为了演示如何通过HDFS中的文件向分区表orders加载数据,这里将文件orders_2025_08.csv和orders_2025_09.csv上传到HDFS的/hive/data/chapter4目录中,操作步骤如下。 ①在HDFS创建/hive/data/chapter4目录,在虚拟机Node02中执行如下命令。 hdfs dfs -mkdir -p /hive/data/chapter4 ===== SLIDE 27 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 06 ②将文件orders_2025_08.csv和orders_2025_09.csv上传到HDFS的/hive/data/chapter4目录中,在虚拟机Node02的/export/data/chapter4目录中执行如下命令。 hdfs dfs -put orders_2025_08.csv orders_2025_09.csv /hive/data/chapter4 ===== SLIDE 28 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 07 通过本地文件系统中的文件orders_np.json向表orders_np加载数据,具体HiveQL语句如下。 LOAD DATA LOCAL INPATH '/export/data/chapter4/orders_np.json' OVERWRITE INTO TABLE chapter4.orders_np; ===== SLIDE 29 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 07 上述命令执行完成后,在DataGrip的“数据库资源管理器”区域,双击chapter4数据库中的表orders_np,查看该表中的数据,如图。 ===== SLIDE 30 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 08 通过HDFS中的文件orders_2025_08.csv向分区表orders加载数据,并分别指定分区字段year和month的值为2025和08,具体HiveQL语句如下。 LOAD DATA INPATH '/hive/data/chapter4/orders_2025_08.csv' OVERWRITE INTO TABLE chapter4.orders PARTITION (year='2025',month='08'); ===== SLIDE 31 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 08 上述命令执行完成后,在DataGrip的“数据库资源管理器”区域,双击chapter4数据库中的分区表orders,查看该分区表中的数据,如图。 ===== SLIDE 32 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 09 通过HDFS中的文件orders_2025_09.csv向分区表orders加载数据,具体HiveQL语句如下。 LOAD DATA INPATH '/hive/data/chapter4/orders_2025_09.csv' INTO TABLE chapter4.orders; ===== SLIDE 33 ===== 4.1 任务:向表加载文件 7. INPUTFORMAT子句和SERDE子句 STEP 09 上述命令执行完成后,会触发Tez执行分布式计算,将数据加载到分区表orders中。执行完成后,在DataGrip的“数据库资源管理器”区域,双击chapter4数据库中的分区表orders,查看该分区表中的数据,如图。 ===== SLIDE 34 ===== 任务:向表插入数据 4.2 ===== SLIDE 35 ===== 掌握插入数据的操作,能够熟练运用INSERT语句向表中插入数据。 学习目标 4.2 任务:向表插入数据 ===== SLIDE 36 ===== 在实际应用中,除了将已有文件加载到表中,还常常需要将少量数据直接写入表,或将查询结果批量写入目标表。为此,Hive提供了INSERT语句,用于向表中插入数据。与LOAD DATA语句不同,INSERT语句会触发底层执行引擎,并在HDFS中生成新的数据文件。Hive支持两种向表插入数据的方式,分别是将值插入表和将查询结果插入表,具体介绍如下。 4.2 任务:向表插入数据 将值插入表 A 将查询结 果插入表 B ===== SLIDE 37 ===== 将值插入表是指通过为表中每个字段指定取值来插入单行或多行数据。如果某个字段无须赋值,不能省略该字段的取值,而必须使用字面量null代替。由于这种方式插入数据的效率较低,并且容易在HDFS中产生小文件,所以并不是大数据场景下向表插入数据的常用手段,而更多用于测试或小规模的数据补录。 4.2 任务:向表插入数据 1. 将值插入表 ===== SLIDE 38 ===== 将值插入表的语法格式如下。 INSERT INTO TABLE [db_name.]table_name [PARTITION (col[=partvalue][,col[=partvalue],...])] VALUES (value[,value,...])[,(value[,value,...]),...] 1. 将值插入表 4.2 任务:向表插入数据 ===== SLIDE 39 ===== 上述语法格式的介绍如下。 1. 将值插入表 4.2 任务:向表插入数据 PARTITION子句 PARTITION子句为可选,用于通过显式指定分区信息,将数据插入到分区表的特定分区中,即静态分区。col参数用于指定分区字段,分区字段的数量与顺序必须与创建分区表时定义的分区字段一致。partvalue参数为可选,用于指定分区字段对应的取值。若未指定分区字段对应的取值,则实现动态分区。例如,PARTITION (year='2025',month='08')表示静态分区,PARTITION (year,month)表示动态分区。 从Hive 3.0开始,可以直接省略PARTITION子句以实现动态分区 ===== SLIDE 40 ===== 1. 将值插入表 4.2 任务:向表插入数据 VALUES子句 VALUES子句用于指定每个字段的取值,每组字段取值由小括号包裹,表示一行数据。value参数用于指定字段的取值,可以是字面量、表达式或函数的返回值。每行数据中值的数量和顺序必须与建表时定义的字段一致。 ===== SLIDE 41 ===== 接下来,演示如何使用将值插入表的方式向chapter4数据库的分区表orders插入数据,具体HiveQL语句如下。 点击查看 4.2 任务:向表插入数据 1. 将值插入表 ===== SLIDE 42 ===== 上述命令执行完成后,在DataGrip的“数据库资源管理器”区域,双击chapter4数据库中的分区表orders,查看该分区表中的数据,如图。 4.2 任务:向表插入数据 1. 将值插入表 ===== SLIDE 43 ===== 将查询结果插入表是指通过SELECT语句将指定表的查询结果插入到目标表中。由于这种方式能够一次性批量插入数据,因此是大数据场景下向表插入数据的常用手段。关于将查询结果插入表的语法格式如下。 INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION (col=value[,col=value,...])] [IF NOT EXISTS]] select_statement; INSERT INTO TABLE [db_name.]table_name [PARTITION (col=value[,col=value,...])] select_statement; 2.将查询结果插入表 4.2 任务:向表插入数据 覆盖插入:先删除目标表的原有数据,再插入新数据 追加插入:向目标表追加数据,不会删除表的原有数据 ===== SLIDE 44 ===== 结果中的最后N个字段会依次作为分区字段的取值,其中N等于分区字段的数量。 接下来,演示如何使用将查询结果插入表的方式向chapter4数据库的分区表orders插入数据,具体HiveQL语句如下。 点击查看 4.2 任务:向表插入数据 2.将查询结果插入表 ===== SLIDE 45 ===== 上述命令执行完成后,在DataGrip的“数据库资源管理器”区域,双击chapter4数据库中的分区表orders,查看该分区表中的数据,如图。 4.2 任务:向表插入数据 2.将查询结果插入表 ===== SLIDE 46 ===== 多重插入 多重插入是指在一次查询中,将同一张表的结果集根据不同条件分别插入到多个目标表中。其核心目标是一次扫描,多个插入,从而减少对表的重复扫描,提升整体执行效率。关于多重插入的语法格式如下。 4.2 任务:向表插入数据 FROM [db_name.]table_name INSERT OVERWRITE TABLE … [INSERT INTO TABLE …] …; ===== SLIDE 47 ===== 多重插入 现在希望通过多重插入,将chapter4数据库中分区表orders中的字段user_id和quantities插入分区表orders_user_quantities,并将分区表orders中的字段user_id和user_client插入分区表orders_user_client,具体HiveQL语句如下。 4.2 任务:向表插入数据 FROM chapter4.orders INSERT INTO TABLE chapter4.orders_user_quantities SELECT user_id,quantities,year,month INSERT INTO TABLE chapter4.orders_user_client SELECT user_id,user_client,year,month ===== SLIDE 48 ===== 任务:将查询结果写入文件 4.3 ===== SLIDE 49 ===== 熟悉将查询结果写入文件的操作,能够使用INSERT语句将表的查询结果导出到指定文件中。 学习目标 4.3 任务:将查询结果写入文件 ===== SLIDE 50 ===== 在Hive中,查询结果通常会被插入到表中,以便后续分析与处理。但为了便于外部系统使用,Hive还提供了一种更灵活的方式,将查询结果直接写入文件并存放在文件系统中。 4.3 任务:将查询结果写入文件 ===== SLIDE 51 ===== INSERT OVERWRITE [LOCAL] DIRECTORY directory [ROW FORMAT row_format] [STORED AS file_format] select_statement 关于Hive中将查询结果写入文件的语法格式如下。 语法格式 4.3 任务:将查询结果写入文件 用于指定查询结果的写入位置是否为本地文件系统 用于指定文件的存放路径,若路径不存在则自动创建 用于指定查询结果的序列化格式,默认为原生SerDe 用于指定文件的存储格式,默认为TEXTFILE 用于指定查询语句 ===== SLIDE 52 ===== 接下来,演示如何将chapter4数据库中分区表orders的全部数据写入到本地文件系统,具体HiveQL语句如下。 INSERT OVERWRITE LOCAL DIRECTORY '/export/data/chapter4/export' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '|' MAP KEYS TERMINATED BY ':' SELECT * FROM chapter4.orders; 4.3 任务:将查询结果写入文件 ===== SLIDE 53 ===== 上述命令执行完成后,在虚拟机Node02的/export/data/chapter4/export路径下会生成一个名为000000_0的文件,通过cat命令查看该文件的内容,如图。 4.3 任务:将查询结果写入文件 ===== SLIDE 54 ===== 多路径写入 多路径写入是指在一次查询中,将同一张表的结果集根据不同条件分别写入到多个路径的文件中。其核心目标是一次扫描,多路径写入,从而减少对表的重复扫描,提升整体执行效率。关于多路径写入的语法格式如下。 4.3 任务:将查询结果写入文件 FROM [db_name.]table_name INSERT OVERWRITE [LOCAL] DIRECTORY … [INSERT OVERWRITE [LOCAL] DIRECTORY …] …; ===== SLIDE 55 ===== 多重导出 例如,将chapter4数据库中分区表orders的year=2025/month=08和year=2025/month=09两个分区,分别导出到本地文件系统的/export/data/chapter4/export/2025-08和/export/data/chapter4/export/2025-09路径下,具体HiveQL语句如下。 4.3 任务:将查询结果写入文件 点击查看 ===== SLIDE 56 ===== 任务:执行Hive事务操作 4.4 ===== SLIDE 57 ===== Hive的数据操作语言除了包含包含加载文件、插入数据和写入查询结果之外,还支持更新和删除操作。不过,这些操作仅适用于已启用事务支持的表。因此,在讲解这些操作之前,需要先介绍Hive事务的概念。本任务将以事务为切入点,逐步展开对Hive中更新和删除操作的讲解。 4.4 任务:执行Hive事务操作 ===== SLIDE 58 ===== 了解事务,能够描述事务的ACID特性。 学习目标 4.4.1 认识事务 ===== SLIDE 59 ===== 在传统的关系型数据库管理系统(RDBMS)中,事务(Transaction)是保证数据一致性和可靠性的重要机制。事务具有典型的ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),具体介绍如下。 4.4.1 认识事务 ===== SLIDE 60 ===== 4.4.1 认识事务 每个事务作为一个整体,要么全部执行成功,要么全部失败,不会出现部分成功的情况。 原子性 事务执行前后,数据始终保持一致的约束状态。 一致性 多个事务同时执行时,彼此之间不会相互干扰。 隔离性 一旦事务提交,其修改结果会被永久保存,不会因系统故障而丢失。 持久性 事务 ===== SLIDE 61 ===== 了解Hive中的事务,能够描述基础文件和增量文件。 学习目标 4.4.2 了解Hive中的事务 ===== SLIDE 62 ===== Hive最初的设计目标是面向大规模数据的批处理分析,而非高频事务处理。因此在早期版本中,并不支持事务操作,表中数据一旦写入,几乎只能进行只读查询或整体覆盖。 4.4.2 了解Hive中的事务 ===== SLIDE 63 ===== 随着Hive在企业级数据仓库和大数据场景中的广泛应用,事务逐渐成为必需功能。尤其是在涉及数据更新与删除时,事务机制能够管理数据版本,避免错误或不一致。为满足这一需求,Hive社区自0.13版本开始逐步引入事务支持,并在后续版本中不断完善,使用户能够执行更新、删除等事务操作,从而更好地满足数据管理需求。 4.4.2 了解Hive中的事务 ===== SLIDE 64 ===== Hive 的数据通常存储在HDFS上,而HDFS不支持修改已有文件内容,仅允许在文件末尾追加数据。这一限制直接影响了Hive表中数据的更新和删除。为此,Hive在事务表中引入了基础文件和增量文件两类文件,用于分别存储数据和事务操作,具体介绍如下。 4.4.2 了解Hive中的事务 增量 文件 基础 文件 ===== SLIDE 65 ===== 基础文件用于存储事务表的数据。在物理层面,Hive会根据事务表是否分区,在事务表的数据存储目录或分区目录下生成以base为前缀的目录,用于存放基础文件。 基础文件 4.4.2 了解Hive中的事务 增量文件用于记录事务表的事务操作,包括插入、更新、删除等。 增量文件 ===== SLIDE 66 ===== 在查询事务表数据时,Hive会同时读取基础文件和增量文件,并在查询过程中应用事务操作的逻辑。若事务表进行了分区,Hive会根据查询条件,仅读取相关分区目录下的基础文件与增量文件,从而提升查询效率。 随着事务表中事务操作的不断增加,增量文件的数量也会逐渐增多。如果在查询时需要处理过多的增量文件,不仅会降低查询性能,还会因小文件过多而加重HDFS的元数据管理开销。 4.4.2 了解Hive中的事务 ===== SLIDE 67 ===== 为解决这一问题,Hive在后台进程中提供了Compactor(合并器),用于合并增量文件,Compactor会将合并任务以MapReduce的形式提交到YARN集群执行。Compactor内部主要由4个核心组件组成,分别是Initiator、Worker、Cleaner和AcidHouseKeeperService,具体介绍如下。 4.4.2 了解Hive中的事务 1 Initiator组件: Worker组件 Cleaner组件: 负责清除旧的基础文件或增量文件。 负责发现需要进行合并的增量文件。 2 3 负责实际执行合并任务。 AcidHouseKeeperService组件: 负责清理执行失败或异常中断的事务。 4 ===== SLIDE 68 ===== Compactor合并增量文件的方式主要分为Minor Compaction(小合并)和Major Compaction(大合并)两种类型,具体介绍如下。 4.4.2 了解Hive中的事务 Major Compaction Minor Compaction ===== SLIDE 69 ===== Minor Compaction将多份现有增量文件合并为一个新的增量文件,从而减少增量文件的数量。旧的增量文件会被标记为删除,并最终清理。若事务表进行了分区,则仅针对各分区目录下的增量文件进行合并。默认情况下,当表的数据存储目录或某个分区目录下的增量文件数达到10时,会自动触发。 1. Minor Compaction 4.4.2 了解Hive中的事务 ===== SLIDE 70 ===== 具体格式 Minor Compaction除了可以自动触发外,也支持手动触发,语法格式如下。 ALTER TABLE [db_name.]table_name [PARTITION (col[=partvalue][,col[=partvalue],...])] COMPACT 'minor'; 4.4.2 了解Hive中的事务 1. Minor Compaction ===== SLIDE 71 ===== Major Compaction将所有增量文件中的事务操作应用到基础文件,生成新的基础文件。若新建事务表不存在基础文件,则基于所有增量文件生成基础文件。旧的基础文件和增量文件会被标记为删除,并最终清理。若事务表进行了分区,则上述过程仅针对各分区目录下的增量文件和基础文件。 2. Major Compaction 4.4.2 了解Hive中的事务 ===== SLIDE 72 ===== 具体代码 默认情况下,当表的数据存储目录或某个分区目录下所有增量文件的总大小达到基础文件的10%时,会自动触发。Major Compaction除了可以自动触发外,也支持手动触发,语法格式如下。 ALTER TABLE [db_name.]table_name [PARTITION (col[=partvalue][,col[=partvalue],...])] COMPACT 'major'; 4.4.2 了解Hive中的事务 2. Major Compaction 需要注意的是,在Hive中的事务表必须是文件格式为ORC的内部表,且显式指定预定义属性transactional的值为TRUE。此外,事务表仅支持通过插入数据的方式导入数据。 ===== SLIDE 73 ===== 在手动触发合并时,HiveServer2需要直接连接存储元数据的关系型数据库以获取元数据信息,而不是通过Metastore进行访问。因此,为确保HiveServer2能够精确连接到存储元数据的关系型数据库,需要在HiveServer2的配置文件中添加连接参数。 手动触发合并 4.4.2 了解Hive中的事务 ===== SLIDE 74 ===== 针对本教材中远程模式部署的Hive为例,需要虚拟机Node02的/export/servers/hive-4.1.0/conf目录中,编辑Hive配置文件hive-site.xml,在该文件的标签中添加如下配置。 4.4.2 了解Hive中的事务 手动触发合并 点击查看 ===== SLIDE 75 ===== 了解事务操作,能够完成启用事务支持的操作。 学习目标 4.4.3 启用事务支持 ===== SLIDE 76 ===== 默认情况下,Hive并未启用事务支持。若要在Hive中创建事务表并执行事务操作,需要在配置文件中添加相关参数以启用事务支持。以下为必须配置的关键参数。 1 hive.support.concurrency参数: hive.txn.manager参数: hive.compactor.initiator.on参数: 用于控制是否启用Compactor的Initiator组件。 用于控制是否启用并发支持。 2 3 用于指定事务管理器的实现类。 hive.compactor.cleaner.on参数: 用于控制是否启用Compactor的Cleaner组件。 4 4.4.3 启用事务支持 hive.compactor.worker.threads参数: 用于控制Compactor中Worker组件的数量。 5 ===== SLIDE 77 ===== 接下来,以远程模式部署的Hive为例,演示如何启用事务支持,并完成创建事务表和插入数据的操作,具体步骤如下。 4.4.3 启用事务支持 ===== SLIDE 78 ===== STEP 01 在虚拟机Node02的/export/servers/hive-4.1.0/conf目录中,编辑Hive配置文件hive-site.xml,在该文件的标签中添加如下配置。 4.4.3 启用事务支持 点击查看 ===== SLIDE 79 ===== STEP 02 在虚拟机Node03的/export/servers/hive-4.1.0/conf目录中,编辑Hive配置文件hive-site.xml,在该文件的标签中添加如下配置。 4.4.3 启用事务支持 hive.compactor.initiator.on true hive.compactor.cleaner.on true ===== SLIDE 80 ===== STEP 03 分别在虚拟机Node02和Node03中重新启动HiveServer2和Metastore,使配置文件修改的内容生效。 4.4.3 启用事务支持 ===== SLIDE 81 ===== STEP 04 在chapter4数据库中创建事务表orders_transaction,具体HiveQL语句如下。 4.4.3 启用事务支持 点击查看 ===== SLIDE 82 ===== STEP 05 向事务表orders_transaction插入数据,具体HiveQL语句如下。 4.4.3 启用事务支持 INSERT INTO TABLE chapter4.orders_transaction SELECT order_id, user_id, items, quantities, user_client, order_time, year, month FROM chapter4.orders; ===== SLIDE 83 ===== STEP 06 查看事务表orders_transaction在HDFS中的目录结构,在虚拟机Node02中执行如下命令。 4.4.3 启用事务支持 hdfs dfs -ls -R /user/hive/remote/warehouse/chapter4.db/orders_transaction ===== SLIDE 84 ===== STEP 06 上述命令执行完成后输出的目录结构如下。 4.4.3 启用事务支持 点击查看 ===== SLIDE 85 ===== STEP 06 在DataGrip的“数据库资源管理器”区域,双击chapter4数据库中的事务表orders_transaction,查看该事务表中的数据,如图。 4.4.3 启用事务支持 ===== SLIDE 86 ===== 查看增量文件或基础文件的内容 由于事务表采用ORC文件格式,因此无论是增量文件还是基础文件,其内容均为二进制数据,无法直接通过文本方式查看。若需要查看HDFS中这些文件的内容,可以使用Hive提供的ORCFileDump工具,其语法格式如下。 4.4.3 启用事务支持 语法格式 hive --orcfiledump -d path 用于指定增量文件或基础文件在HDFS上的路径 ===== SLIDE 87 ===== 了解事务操作,能够完成事务更新的操作。 学习目标 4.4.4 更新操作 ===== SLIDE 88 ===== 在实际业务场景中,数据往往会随着业务的发展而不断调整。在传统的关系型数据库中,通常通过UPDATE语句完成数据修改。但在Hive的早期版本中,表中的数据几乎是只读的,一旦写入便无法直接更新。为了解决这一问题,Hive在事务表中引入了更新操作,使用户能够直接修改事务表中已有的数据。 4.4.4 更新操作 ===== SLIDE 89 ===== 具体语法 在Hive中更新操作的语法格式如下。 UPDATE [db_name.]table_name SET column=value [,column=value,...] [WHERE expression]; 4.4.4 更新操作 用于修改事务表中已有的数据 用于指定修改的字段 用于指定字段修改后的值,可以是常量、表达式或者函数返回值 用于指定筛选条件,表示仅修改符合筛选条件的行中指定字段的值 用于定义筛选条件。若省略WHERE子句,则修改所有行中指定字段的值 ===== SLIDE 90 ===== HiveQL语句 接下来,演示如何修改chapter4数据库中事务表orders_transaction的已有数据,具体HiveQL语句如下。 UPDATE chapter4.orders_transaction SET items=array('SKU008'),quantities=map('SKU008',2) WHERE year='2025' AND month='09' AND order_id=10007; 4.4.4 更新操作 ===== SLIDE 91 ===== 在DataGrip的“数据库资源管理器”区域,双击chapter4数据库中的事务表orders_transaction,查看该事务表中的数据,如图。 4.4.4 更新操作 ===== SLIDE 92 ===== 了解事务操作,能够完成事务删除的操作。 学习目标 4.4.5 删除操作 ===== SLIDE 93 ===== 在数据仓库的日常管理中,除了需要设计数据的加载、插入和更新外,往往还会涉及删除数据的需求。在传统的关系型数据库中,通常通过DELETE语句完成删除操作。但在Hive的早期版本中,表中的数据几乎是只读的,因此并不支持直接删除。为了解决这一问题,Hive在事务表中引入了删除操作,使用户能够安全、可靠地删除事务表中的数据。 4.4.5 删除操作 ===== SLIDE 94 ===== 语法格式 在Hive中删除操作的语法格式如下。 DELETE FROM [db_name.]table_name [WHERE expression]; 4.4.5 删除操作 在上述语法格式中,若省略WHERE子句,则删除事务表的所有行,否则仅删除符合筛选条件的行。 ===== SLIDE 95 ===== HiveQL语句 接下来,演示如何删除chapter4数据库中事务表orders_transaction的数据,具体HiveQL语句如下。 DELETE FROM chapter4.orders_transaction WHERE year='2025' AND month='09' AND order_id=10007; 4.4.5 删除操作 上述语句表示删除分区year=2025/month=09中字段order_id的值等于10007的行。 ===== SLIDE 96 ===== 在DataGrip的“数据库资源管理器”区域,双击chapter4数据库中的事务表orders_transaction,查看该事务表中的数据,如图。 4.4.5 删除操作 ===== SLIDE 97 ===== 任务:导入与导出数据 4.5 ===== SLIDE 98 ===== 了解导入与导出数据,能够完成表级别的数据迁移与复制操作。 学习目标 4.5 任务:导入与导出数据 ===== SLIDE 99 ===== 在数据仓库的日常管理中,除了常见的加载文件、插入数据和写入查询结果等操作外,Hive还提供了 EXPORT和IMPORT两条语句,用于表级别的数据迁移与复制。这两条语句通常配合使用,主要用于在不同Hive系统之间传输表及其数据,或者在备份与恢复场景中使用,具体介绍如下。 IMPORT语句 EXPORT语句 4.5 任务:导入与导出数据 ===== SLIDE 100 ===== 语法格式 EXPORT语句用于将表的元数据和数据一并导出到HDFS的指定目录中,具体语法格式如下。 EXPORT TABLE [db_name.]table_name [PARTITION (col=value[,col=value,...])] TO export_target_path; 1. EXPORT语句 用于指定导出目录在HDFS上的路径 4.5 任务:导入与导出数据 ===== SLIDE 101 ===== HiveQL语句 接下来,演示如何将chapter4数据库中分区表orders的分区year=2025/month=08导出到HDFS的指定路径,具体HiveQL语句如下。 EXPORT TABLE chapter4.orders PARTITION (year='2025', month='08') TO '/hive/data/chapter4/orders_2025_08'; 1. EXPORT语句 4.5 任务:导入与导出数据 ===== SLIDE 102 ===== HiveQL语句 IMPORT语句用于从HDFS指定目录中读取由EXPORT语句导出的数据和元数据,并在当前Hive环境中导入相应的表,其语法格式如下。 IMPORT [[EXTERNAL] TABLE [db_name.]table_name [PARTITION (col=value[,col=value,...])]] FROM source_path [LOCATION hdfs_path] 2. IMPORT语句 用于指定导入的表为外部表 用于指定EXPORT语句导出的数据和元数据所在路径 用于指定表在HDFS中存储数据的路径,通常与外部表配合使用 4.5 任务:导入与导出数据 ===== SLIDE 103 ===== 在IMPORT语句中,可以省略表名、所属数据库及分区信息等表定义,Hive会根据 EXPORT语句导出的元数据自动判断并执行导入操作。需要注意的是,若导入的表是分区表且已存在,则导入的分区不能与现有分区表的分区重复;若导入的表是非分区表且已存在,则要求现有表必须为空。 2. IMPORT语句 4.5 任务:导入与导出数据 ===== SLIDE 104 ===== HiveQL语句 接下来,演示如何将EXPORT语句导出的元数据和数据导入到当前Hive环境中,具体HiveQL语句如下。 IMPORT TABLE chapter4.orders_copy FROM '/hive/data/chapter4/orders_2025_08'; 2. IMPORT语句 4.5 任务:导入与导出数据 ===== SLIDE 105 ===== 在DataGrip的“数据库资源管理器”区域,双击chapter4数据库中的分区表orders_copy,查看该分区表中的数据,如图。 2. IMPORT语句 4.5 任务:导入与导出数据 ===== SLIDE 106 ===== AI助学 学完本单元后,我已经初步掌握了Hive中数据加载、数据插入、查询结果写出等操作。然而,在实际处理数据时,需要结合数据来源、目标表结构、操作目的和数据更新方式,判断应采用哪种数据操作方案。此时,可以借助AI对数据操作流程进行分析,帮助检查操作顺序是否合理,并提示可能存在的问题。 AI 助 学 ===== SLIDE 107 ===== 单元总结 本单元主要讲解了Hive的数据操作语言。首先,介绍了向表加载文件。接着,介绍了向表插入数据和将查询结果写入文件。然后,介绍了事务操作,包括事务的概念、启用事务支持、更新操作等。最后,介绍了导入与导出数据。通过本单元的学习,读者能够熟练运用HiveQL语句对Hive中的数据进行加载、插入、导出等操作,为实际应用中管理数据仓库的数据奠定基础。 单 元 总 结